#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>

void func(int numero)
{
  printf("j'affiche le numéro %d\n", numero);
}

int main() {
  ucontext_t uc, previous;

  getcontext(&uc);
  uc.uc_stack.ss_size = 64*1024;
  uc.uc_stack.ss_sp = malloc(uc.uc_stack.ss_size); //ss_sp = pointeur de pile
  uc.uc_link = &previous;
  makecontext(&uc, (void (*)(void)) &func, 1, 34);

  printf("je suis dans le main\n");// Là le contexte courant est dans le main
  swapcontext(&previous, &uc);//Je saute au contexte uc tout en gardant une trace sur le contexte courant = previous  pour pouvoir y revenir une fois le contexte uc terminé; previous contient le contexte actuel dans le main.
  printf("je suis revenu dans le main\n");//Après avoir exécuté le contexte uc qui contient la fonction func on revient au contexte précédent previous qui est dans le main.

  getcontext(&uc);//On réinitialise uc avec le contexte actuel
  uc.uc_stack.ss_size = 64*1024;
  uc.uc_stack.ss_sp = malloc(uc.uc_stack.ss_size);
  uc.uc_link = NULL;
  makecontext(&uc, (void (*)(void)) &func, 1, 57);//Modifier le contexte uc-->le contexte de func

  printf("je suis dans le main\n");//On est toujours dans le contexte main
  setcontext(&uc);//On saute au contexte uc mais on enregistre pas le contexte courant qui est dans le main ce qui nous empêche de revenir au main!!!
  
  printf("je ne reviens jamais ici\n");
  return 0;
}
